#include<bits/stdc++.h>
using namespace std;
int n,m,fa[100005];
long long p[100005],tag[100005];
int lastt[100005],cnt;
int readint(){
     int ret=0,ff=1;
     char c=getchar();
    while((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')ff=-1,c=getchar();
    while(c>='0'&&c<='9')ret=ret*10+c-'0',c=getchar();
    return ret*ff;
}
long long readll(){
 long long ret=0,ff=1;
     char c=getchar();
    while((c<'0'||c>'9')&&c!='-')c=getchar();
    if(c=='-')ff=-1,c=getchar();
    while(c>='0'&&c<='9')ret=ret*10+c-'0',c=getchar();
    return ret*ff;
}
struct Edge{
    int endd,next;
}e[200005];
void Add(int x,int y){
    e[++cnt].endd=y;
    e[cnt].next=lastt[x];
    lastt[x]=cnt;
}
void DFS(int now,int prt){
    fa[now]=prt;
    for( int i=lastt[now];i;i=e[i].next){
         int y=e[i].endd;
        if(y==prt)continue;
        DFS(y,now);
    }
}
int main(){
    n=readint(),m=readint();
    for(int i=1;i<=n;i++)p[i]=readll();
    for(int i=1,x,y;i<n;i++){
        x=readint(),y=readint();
        Add(x,y);
        Add(y,x);
    }
    DFS(1,0);
    for(int i=1;i<=m;i++){
         int opt,x;
         long long ans=0,enddt=1,y;
        opt=readint();x=readint();
        if(opt==3){
            do {
                ans+=p[x]+enddt*tag[x];
                x=fa[x];
                ++enddt;
            } while(x);
            printf("%lld\n",ans);
        }
        else {
            y=readll();
            if(opt==1)p[x]+=y;
            else tag[x]+=y;
        }
    }
    return 0;
}